widget: Fix transform refcounting in allocate()
authorBenjamin Otte <otte@redhat.com>
Wed, 29 May 2019 12:48:27 +0000 (14:48 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 29 May 2019 14:34:56 +0000 (16:34 +0200)
Make the transform (transfer full).

1. This makes sure we actually reference the transform. Previously we
   did not.
2. Most callers create a new transform to pass to us. Now they don't
   have to uref it anymore.

gtk/gtkfixedlayout.c
gtk/gtkrevealer.c
gtk/gtkwidget.c
tests/testwidgettransforms.c

index 5363d8e4e517452bf64e965b5ed9150a767765e1..77e923add0477468c78b478c9d90ee59db608b37 100644 (file)
@@ -301,7 +301,7 @@ gtk_fixed_layout_allocate (GtkLayoutManager *layout_manager,
                            child_req.width,
                            child_req.height,
                            -1,
-                           child_info->position);
+                           gsk_transform_ref (child_info->position));
     }
 }
 
index 065d1ab1ffcae7cbee3846e37270ab7281d36216..68e4eba8282ff766acc1678da843d914b182b217 100644 (file)
@@ -458,7 +458,6 @@ gtk_revealer_real_size_allocate (GtkWidget *widget,
     }
 
   gtk_widget_allocate (child, child_width, child_height, -1, transform);
-  gsk_transform_unref (transform);
 }
 
 static void
index 9a393a5bb919023cfafa3cb866e4b0941a69a520..26dbae11970469141c26c9dbe8e0e3128965ed6e 100644 (file)
@@ -4233,8 +4233,6 @@ gtk_widget_size_allocate (GtkWidget           *widget,
                        allocation->height,
                        baseline,
                        transform);
-
-  gsk_transform_unref (transform);
 }
 
 /**
@@ -4243,7 +4241,7 @@ gtk_widget_size_allocate (GtkWidget           *widget,
  * @width: New width of @widget
  * @height: New height of @widget
  * @baseline: New baseline of @widget, or -1
- * @transform: (transfer none) (allow-none): Transformation to be applied to @widget
+ * @transform: (transfer full) (allow-none): Transformation to be applied to @widget
  *
  * This function is only used by #GtkWidget subclasses, to assign a size,
  * position and (optionally) baseline to their child widgets.
@@ -4303,10 +4301,8 @@ gtk_widget_allocate (GtkWidget    *widget,
                   priv->allocated_height != height);
   transform_changed = !gsk_transform_equal (priv->allocated_transform, transform);
 
-  /* order is important, sometimes priv->allocated_transform == transform */
-  gsk_transform_ref (transform);
   gsk_transform_unref (priv->allocated_transform);
-  priv->allocated_transform = transform;
+  priv->allocated_transform = gsk_transform_ref (transform);
   priv->allocated_width = width;
   priv->allocated_height = height;
   priv->allocated_size_baseline = baseline;
@@ -11435,7 +11431,7 @@ gtk_widget_ensure_allocate (GtkWidget *widget)
                            priv->allocated_width,
                            priv->allocated_height,
                            priv->allocated_size_baseline,
-                           priv->allocated_transform);
+                           gsk_transform_ref (priv->allocated_transform));
     }
   else if (priv->alloc_needed_on_child)
     {
index 62c99b994ad3d488b1f7851a5679d0e96307d0ca..d8cf78fc6c5c58e05b919d1871a86f11ff4f459d 100644 (file)
@@ -128,8 +128,6 @@ gtk_transform_tester_size_allocate (GtkWidget  *widget,
                        w, h,
                        -1,
                        global_transform);
-
-  gsk_transform_unref (global_transform);
 }
 
 static void